// 闭包的应用
function memoryCache(func) {
    let cache = {};
    return function() {
        // arguments是个对象 转换后用其做键，保存下来他的值，带下一次一样的输入进来时可以直接获取value
        let args = JSON.stringify(arguments);

        // cache中有则直接返回
        if (cache[args]) {
            return cache[args];
        } else {
            // 函数计算 然后入cache对象
            let result = func.apply(this, arguments);
            cache[args] = result;
            return result;
        }
    }
}
// 测试代码
function add(a, b) {
    console.log("正在计算...");
    return a + b;
}
/*
在这个示例代码中，我们定义了一个接受一个函数func作为参数的memoryCache函数。这个函数返回一个新的函数，这个新函数会缓存func函数的调用结果。
具体来说，当新函数第一次被调用时，它会将函数参数序列化为一个字符串，然后以这个字符串为key，将函数调用结果缓存起来。
之后，如果新函数再次被调用，它会先检查缓存中是否已经有了这个函数调用结果，如果有，则直接返回缓存中的结果，否则再调用一次原来的函数来计算结果并缓存。

这个内存函数缓存的示例代码可以让我们避免重复计算，提高代码的性能。当然，在实际编程中需要注意缓存的内存占用问题，避免过度缓存导致内存泄漏等问题。
 */
const cachedAdd = memoryCache(add);
console.log(cachedAdd(1, 2)); // 输出 "正在计算... 3"
console.log(cachedAdd(1, 2)); // 直接返回上一次的结果 3
